home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / misc / easytransfer.lzh / EasyTransfer / AmigaSource / Serial.c < prev   
Encoding:
C/C++ Source or Header  |  1995-11-11  |  9.7 KB  |  449 lines

  1.  
  2. /* Serial.c By Kamran Karimi 
  3.    Part of EasyAmiga source.
  4. */
  5. #include <dos.h>
  6.  
  7. #include <exec/types.h>
  8. #include <exec/io.h>
  9.  
  10. #include <devices/serial.h>
  11. #include <devices/timer.h>
  12.  
  13. #include <proto/exec.h>
  14.  
  15. #include <hardware/custom.h>
  16. #include <hardware/intbits.h>
  17.  
  18. extern struct Custom far custom;
  19. #define RBF 14
  20.  
  21. #include "ErrCodes.h"
  22.  
  23. #define min(a,b) (((a) <= (b)) ? (a) : (b))
  24.  
  25. extern struct PacketStruct Packet; 
  26.  
  27. #define SERTESTLEN 255
  28. #define PACKET_SIZE 255
  29. #define RECBUFFLEN 260 /* PACKET_SIZE + 5 */
  30. struct PacketStruct
  31. {
  32.  UBYTE Len;
  33.  UBYTE Data[PACKET_SIZE + 2];
  34. };
  35.  
  36. extern VOID Message(LONG MessageNum);
  37. extern LONG CheckEsc(VOID);
  38. extern VOID ShowTransfer(int Direction, UBYTE Len);
  39.  
  40. extern ULONG WorkstationWait[MAXHARDSPEED];
  41.  
  42. extern SHORT CheckSumTry; 
  43. extern char SerialName[];
  44. extern SHORT UnitNum;
  45. extern ULONG Speed[MAXHARDSPEED];
  46. extern SHORT CurrSpeed,DelayTime;
  47.  
  48. struct MsgPort *SerialMP = NULL;
  49. struct IOExtSer *SerialIO = NULL;
  50.  
  51. struct MsgPort *TimerMP = NULL;
  52. struct timerequest *TimerIO = NULL;
  53.  
  54. ULONG Serial_OK = FALSE;
  55. ULONG Timer_OK = FALSE;
  56. ULONG SystemRequest = FALSE;
  57.  
  58. LONG OpenTimer(VOID)
  59. {
  60.  LONG Unit = UNIT_VBLANK;
  61.  
  62.  if(TimerMP = CreatePort(NULL,0))
  63.  {
  64.   if(TimerIO = (struct timerequest *) 
  65.                            CreateExtIO(TimerMP,sizeof(struct timerequest)))
  66.   {
  67.    if(!OpenDevice("timer.device",Unit,(struct IORequest *)TimerIO,0))
  68.     {
  69.      Timer_OK = TRUE; 
  70.      return NO_ERROR;
  71.     }
  72.    else return ERROR_OpenDevice;
  73.   }
  74.   else return ERROR_CreateExtIO;
  75.  }
  76.  else return ERROR_CreatePort;
  77. }
  78.  
  79.  
  80. VOID CloseTimer(VOID)
  81. {
  82.  if(Timer_OK) 
  83.  { 
  84.   CloseDevice((struct IORequest *)TimerIO);
  85.   Timer_OK = FALSE;
  86.  }
  87.  if(TimerIO) { DeleteExtIO((struct IORequest *)TimerIO); TimerIO = NULL; }
  88.  if(TimerMP) { DeletePort(TimerMP); TimerMP = NULL; }
  89. }
  90.  
  91.  
  92. LONG OpenSerial(VOID)
  93. {
  94.  if(SerialMP = CreatePort(NULL,0))
  95.  {
  96.   if(SerialIO = (struct IOExtSer *)
  97.                                 CreateExtIO(SerialMP,sizeof(struct IOExtSer)))
  98.   {
  99.    SerialIO->io_SerFlags = SERF_XDISABLED;
  100.    if(!OpenDevice(SerialName,UnitNum,(struct IORequest *)SerialIO,0))
  101.     {
  102.      Serial_OK = TRUE; 
  103.      return NO_ERROR;
  104.     }
  105.    else return ERROR_OpenDevice;
  106.   }
  107.   else return ERROR_CreateExtIO;
  108.  }
  109.  else return ERROR_CreatePort;
  110. }
  111.  
  112.  
  113. LONG ActualSendPacket(USHORT Len)
  114. {
  115.  ULONG Sig;
  116.  LONG Error;
  117.  
  118.  if(Serial_OK)
  119.  {
  120.   if((Error = CheckEsc())) return Error;
  121.   if(OpenTimer()) { CloseTimer(); return ERROR_Timer; }
  122.   SerialIO->IOSer.io_Command = CMD_WRITE;
  123.   SerialIO->IOSer.io_Length = Len;
  124.   SerialIO->IOSer.io_Data = (APTR)Packet.Data;
  125.   SendIO((struct IORequest *)SerialIO);
  126.   TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  127.   TimerIO->tr_time.tv_secs = 
  128.           (ULONG)( DelayTime + 2 + Len / WorkstationWait[CurrSpeed]);
  129.   TimerIO->tr_time.tv_micro = 5;
  130.   SendIO((struct IORequest *)TimerIO);
  131.   Sig = Wait(( 1 << SerialMP->mp_SigBit) | (1 << TimerMP->mp_SigBit));
  132.   if(Sig & (1 << TimerMP->mp_SigBit))
  133.   {
  134.    AbortIO((struct IORequest *)SerialIO);
  135.    WaitIO((struct IORequest *)SerialIO);
  136.  
  137.    WaitIO((struct IORequest *)TimerIO);
  138.    CloseTimer(); 
  139.    return ERROR_Timeout;
  140.   }
  141.   else
  142.   {
  143.    WaitIO((struct IORequest *)SerialIO);
  144.  
  145.    AbortIO((struct IORequest *)TimerIO);
  146.    WaitIO((struct IORequest *)TimerIO);
  147.    CloseTimer();
  148.    return NO_ERROR;
  149.   }
  150.  }
  151.  else return ERROR_NoDevice;
  152.  
  153. /*
  154. LONG ActualReceivePacketHard(USHORT Len)
  155. {
  156.  LONG Error;
  157.  USHORT Enable,Offset;
  158.  struct Message *TimerMsg;
  159.  
  160.  if(Serial_OK)
  161.  {
  162.   if((Error = CheckEsc())) return Error;
  163.   if(OpenTimer()) { CloseTimer(); return ERROR_Timer; }
  164.   Enable = custom.intenar;
  165.   Enable &= INTF_RBF;
  166.   custom.intena = INTF_RBF; 
  167.   Offset = 0;
  168.    TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  169.   if(SystemRequest)
  170.    TimerIO->tr_time.tv_secs = 0;
  171.   else
  172.    TimerIO->tr_time.tv_secs = 
  173.             (ULONG)(DelayTime + 2 + Len / WorkstationWait[CurrSpeed]);
  174.   if(SystemRequest)
  175.    TimerIO->tr_time.tv_micro = 500;
  176.   else
  177.    TimerIO->tr_time.tv_micro = 5;
  178.   SendIO((struct IORequest *)TimerIO);
  179.   while(!(TimerMsg = GetMsg(TimerMP)))
  180.   {
  181.    if(custom.serdatr & (1 << RBF))
  182.    {
  183.     Packet.Data[Offset] = (UBYTE)(custom.serdatr & 0xFF);
  184.     Offset++;
  185.    }
  186.    if(Offset >= Len) break;
  187.   }
  188.   if(Enable)
  189.    custom.intena = INTF_RBF | INTF_SETCLR;
  190.   if(TimerMsg) 
  191.   {
  192.    ReplyMsg(TimerMsg);
  193.    CloseTimer();
  194.    return ERROR_Timeout;
  195.   }
  196.   else
  197.   {
  198.    AbortIO((struct IORequest *)TimerIO);
  199.    WaitIO((struct IORequest *)TimerIO);
  200.    CloseTimer();   
  201.    return NO_ERROR;
  202.   }
  203.  }
  204.  else return ERROR_NoDevice;
  205. }
  206. */
  207.  
  208. LONG ActualReceivePacket(USHORT Len)
  209. {
  210.  ULONG Sig;
  211.  LONG Error;
  212.  
  213.  if(Serial_OK)
  214.  {
  215.   if((Error = CheckEsc())) return Error;
  216.   if(OpenTimer()) { CloseTimer(); return ERROR_Timer; }
  217.   SerialIO->IOSer.io_Command = CMD_READ;
  218.   SerialIO->IOSer.io_Length = Len;
  219.   SerialIO->IOSer.io_Data = (APTR)Packet.Data;
  220.   SendIO((struct IORequest *)SerialIO);
  221.   TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  222.   if(SystemRequest)
  223.    TimerIO->tr_time.tv_secs = 0;
  224.   else
  225.    TimerIO->tr_time.tv_secs = 
  226.             (ULONG)(DelayTime + 2 + Len / WorkstationWait[CurrSpeed]);
  227.   if(SystemRequest)
  228.    TimerIO->tr_time.tv_micro = 500;
  229.   else
  230.    TimerIO->tr_time.tv_micro = 5;
  231.   SendIO((struct IORequest *)TimerIO);
  232.   Sig = Wait(( 1 << SerialMP->mp_SigBit) | (1 << TimerMP->mp_SigBit));
  233.   if(Sig & (1 << TimerMP->mp_SigBit))
  234.   {
  235.    AbortIO((struct IORequest *)SerialIO);
  236.    WaitIO((struct IORequest *)SerialIO);
  237.  
  238.    WaitIO((struct IORequest *)TimerIO); 
  239.    CloseTimer();
  240.    return ERROR_Timeout;
  241.   }
  242.   else
  243.   {
  244.    WaitIO((struct IORequest *)SerialIO);
  245.  
  246.    AbortIO((struct IORequest *)TimerIO);
  247.    WaitIO((struct IORequest *)TimerIO);
  248.    CloseTimer();   
  249.    return NO_ERROR;
  250.   }
  251.  }
  252.  else return ERROR_NoDevice;
  253.  
  254.  
  255. VOID ClrSer(VOID)
  256. {
  257.  LONG UnRead,Read;
  258.  char ReadBuff[RECBUFFLEN];
  259.  
  260.  if(Serial_OK)
  261.  {
  262.   SerialIO->IOSer.io_Command = SDCMD_QUERY;
  263.   DoIO((struct IORequest *)SerialIO);
  264.   UnRead =  SerialIO->IOSer.io_Actual;
  265.   while(UnRead > 0)
  266.   {
  267.    Read = min(UnRead,RECBUFFLEN);
  268.    SerialIO->IOSer.io_Command = CMD_READ;
  269.    SerialIO->IOSer.io_Length = Read;
  270.    SerialIO->IOSer.io_Data = (APTR)ReadBuff;
  271.    DoIO((struct IORequest *)SerialIO);
  272.    UnRead -= Read;
  273.   }
  274.  }
  275. }
  276.  
  277.  
  278. LONG SendPacket(VOID)
  279. {
  280.  USHORT count;
  281.  LONG Error;
  282.  SHORT NumTry = 1;
  283.  UBYTE temp;
  284.  union Check
  285.  {
  286.   USHORT CheckWord;
  287.   UBYTE CheckByte[2];
  288.  } CheckSum;
  289.  
  290.  if(Packet.Len > 1)
  291.  {
  292.   if(NumTry <= CheckSumTry) NumTry = CheckSumTry + 1;
  293.   CheckSum.CheckWord = 0;
  294.   for(count = 0; count < Packet.Len; count++)
  295.    CheckSum.CheckWord += (USHORT)Packet.Data[count];
  296.   Packet.Data[Packet.Len] = CheckSum.CheckByte[0];
  297.   Packet.Data[Packet.Len + 1] = CheckSum.CheckByte[1];   
  298.   while(NumTry > 0)
  299.   {
  300.    if((Error = ActualSendPacket(Packet.Len + 2))) return Error;
  301.    temp = Packet.Data[0];
  302.    if((Error = ActualReceivePacket(1))) return Error;
  303.    if(Packet.Data[0] == 'Y')
  304.    {
  305.     if((Error = ActualSendPacket(1))) return Error;
  306.     Packet.Data[0] = temp;
  307.     return NO_ERROR;
  308.    }
  309.    else
  310.    {
  311.     NumTry--;
  312.    }
  313.   }
  314.   return ERROR_CheckSum;
  315.  }
  316.  else return ActualSendPacket(Packet.Len); 
  317. }
  318.  
  319. LONG ReceivePacket(VOID)
  320. {
  321.  USHORT count;
  322.  LONG Error;
  323.  SHORT NumTry = 1;
  324.  UBYTE temp;
  325.  union Check
  326.  {
  327.   USHORT CheckWord;
  328.   UBYTE CheckByte[2];
  329.  } CheckSum;
  330.  
  331.  if(Packet.Len > 1)
  332.  {
  333.   if(NumTry <= CheckSumTry) NumTry = CheckSumTry + 1;
  334.   while(NumTry > 0)
  335.   {
  336.    if((Error = ActualReceivePacket(Packet.Len + 2))) return Error;
  337.    CheckSum.CheckWord = 0;
  338.    for(count = 0; count < Packet.Len; count++)
  339.     CheckSum.CheckWord += (USHORT)Packet.Data[count];
  340.    if( (Packet.Data[Packet.Len] != CheckSum.CheckByte[0]) ||
  341.        (Packet.Data[Packet.Len + 1] != CheckSum.CheckByte[1]) )
  342.    {
  343.     NumTry--;
  344.     Packet.Data[0] = 'N';
  345.     if((Error = ActualSendPacket(1))) return Error;
  346.    }
  347.    else 
  348.    {
  349.     temp = Packet.Data[0];
  350.     Packet.Data[0] = 'Y';
  351.     if((Error = ActualSendPacket(1))) return Error;
  352.     if((Error = ActualReceivePacket(1))) return Error;
  353.     Packet.Data[0] = temp;
  354.     return NO_ERROR;
  355.    }
  356.   }
  357.   return ERROR_CheckSum;
  358.  }
  359.  else return ActualReceivePacket(Packet.Len);
  360. }
  361.  
  362.  
  363. VOID CloseSerial(VOID)
  364. {
  365.  if(Serial_OK) 
  366.  { 
  367.   CloseDevice((struct IORequest *)SerialIO);
  368.   Serial_OK = FALSE;
  369.  }
  370.  if(SerialIO) { DeleteExtIO((struct IORequest *)SerialIO); SerialIO = NULL; }
  371.  if(SerialMP) { DeletePort(SerialMP); SerialMP = NULL; }
  372. }
  373.  
  374. LONG ConfigSerial(ULONG BAUD)
  375. {
  376.  ULONG Sig;
  377.  UBYTE SerFlags = SERF_XDISABLED; 
  378.  
  379.  if(Serial_OK)
  380.  {
  381.   SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  382.   SerialIO->io_Baud = BAUD;
  383.   SerialIO->io_ReadLen = 8;
  384.   SerialIO->io_WriteLen = 8;
  385.   SerialIO->io_StopBits = 1;
  386.   SerialIO->io_SerFlags = SerFlags;
  387.   SendIO((struct IORequest *)SerialIO);
  388.   Sig = Wait(1 << SerialMP->mp_SigBit);
  389.   WaitIO((struct IORequest *)SerialIO);  
  390.   return NO_ERROR;
  391.  }
  392.  else return ERROR_NoDevice; 
  393. }
  394.  
  395. LONG GetSynch(VOID)
  396. {
  397.  LONG Error;
  398.  
  399.  Packet.Len = 1;
  400.  if((Error = ReceivePacket())) return Error;
  401.  if(Packet.Data[0] - 150 == ERROR_CHDIR) return ERROR_CHDIR;
  402.  if(Packet.Data[0] - 150 == ERROR_MKDIR) return ERROR_MKDIR;
  403.  if(Packet.Data[0] - 150 == ERROR_RMDIR) return ERROR_RMDIR;
  404.  if(Packet.Data[0] - 150 == ERROR_SendRFile) return ERROR_SendRFile;
  405.  if(Packet.Data[0] - 150 == ERROR_RecFile) return ERROR_RecFile;
  406.  if(Packet.Data[0] - 150 == ERROR_FDelete) return ERROR_FDelete;
  407.  if(Packet.Data[0] - 150 == ERROR_SRFExists) return ERROR_SRFExists;
  408.  if(Packet.Data[0] != '!') return ERROR_NoSynch;
  409.  else return NO_ERROR;
  410. }
  411.  
  412. LONG PutSynch(VOID)
  413. {
  414.  LONG Error;
  415.  
  416.  Packet.Len = 1;
  417.  Packet.Data[0] = '?';
  418.  if((Error = SendPacket())) return Error;
  419.  else return NO_ERROR;
  420.  
  421. LONG PutError(long ErrNo)
  422. {
  423.  LONG Error;
  424.  
  425.  Packet.Len = 1;
  426.  Packet.Data[0] = 150 + ErrNo;
  427.  if((Error = SendPacket())) return Error;
  428.  else return NO_ERROR;
  429.  
  430.  
  431. LONG CheckLink(VOID)
  432. {
  433.  LONG Error;
  434.  
  435.  Packet.Len = 1;
  436.  Packet.Data[0] = 'L';
  437.  if((Error = SendPacket())) return Error;
  438.  Packet.Len = 1;
  439.  SystemRequest = TRUE;
  440.  Error = ActualReceivePacket(1);
  441.  SystemRequest = FALSE;
  442.  if(Error) return ERROR_Link;
  443.  else return NO_ERROR;
  444. }
  445.